from usr.uart import Uart
from usr.constant import *
import sys
import log


# 设置日志输出级别
log.basicConfig(level=log.DEBUG)
uart_log = log.getLogger("【4G-Freescale-communication】")

def crc16_table(bytestr):
    '''
    crc16查表法
    :param bytestr: bytes字符串
    :return: int16类型
    '''
    crc = 0x0000
    data = bytearray(bytestr)
    len1 = len(bytestr)
    for i in range(len1):
        cp = (crc >> 8) ^ data[i]
        crc = ((crc << 8) & 0xFFFF) ^ mCRC16_Tables[cp]
    return crc

def add_crc16_check_sum(str_data):
    '''
    为字符串添加校验和，并将校验和附加在字符串后面
    :param bytestr: 字符串
    :return: bytearry类型
    '''
    #计算校验和
    crc16_ret = crc16_table(str_data)
    uart_log.debug("crc16 ret = 0x%x" %crc16_ret)
    
    #将输入的字符串转成bytearray类型
    bytearray_data = bytearray(str_data)
    uart_log.debug("bytes_data type: %s" % type(bytearray_data))
    
    #将校验和添加进bytearray
    crc16_bytes = crc16_ret.to_bytes(2, 'big')
    bytearray_data.append(crc16_bytes[0])
    bytearray_data.append(crc16_bytes[1])
    
    
    uart_log.info("bytearray_data element count: %d" %len(bytearray_data))
    return bytearray_data
    
    
def add_crc16_and_uart_send(uart_obj, str_data):
    # 添加校验和
    bytearray_data_crc16 = add_crc16_check_sum(str_data)
    
    # 发送数据
    ## (1) 先发送命令码
    uart_obj.uartWrite(SEND_to_FREESCALE_BLOCK_PRM_DATA_CMD)
    
    ## (2) 再发送数据
    uart_obj.uartWrite(bytearray_data_crc16)
    
    
if __name__ == '__main__': 
    uart = Uart()
    if uart is None:
        uart_log.error("create uart object failed, exit program")
        sys.exit(-2)
    
    add_crc16_and_uart_send(uart, "zhy1256lkj")
    